/**************************************************************************//**
 * @item     CosyOS-III 例程（服务应用）
 * @file     coop_yield.c
 * @brief    协作_禅让任务
 * @details  通过禅让任务，实现任务的循环协作。
 * @note     适用于多个相同优先级任务的循环协作，依赖时间片轮转调度算法。
 * @author   迟凯峰
 * @version  V1.0.0
 * @date     2025.10.21
 ******************************************************************************/

/*--------------------------------*
 | 服务            | 描述         |
 |-----------------+--------------|
 | uYieldTasking() | 禅让自身任务 |
 *--------------------------------*/

/*
    注意事项：
    1、需开启相同优先级任务的时间片轮转调度。
    2、每个任务的运行时间，都必须小于时间片时间。
    3、任务的启动顺序，决定了任务的协作运行顺序。
 */

#if 1 /* 编译开关 */

#include "CosyOS.H"

/* task_1 */
uCreateTask(task_1, 1, 384, 0, 0)
{
    while(1){
        /* 协作处理事务 开始 */
        
        /* 协作处理事务 结束 */
        /* 同步至task_2 开始 */
        uYieldTasking();
        /* 同步至task_2 结束 */
    }
}

/* task_2 */
uCreateTask(task_2, 1, 384, 0, 0)
{
    while(1){
        /* 协作处理事务 开始 */
        
        /* 协作处理事务 结束 */
        /* 同步至task_3 开始 */
        uYieldTasking();
        /* 同步至task_3 结束 */
    }
}

/* task_3 */
uCreateTask(task_3, 1, 384, 0, 0)
{
    while(1){
        /* 协作处理事务 开始 */
        
        /* 协作处理事务 结束 */
        /* 同步至task_1 开始 */
        uYieldTasking();
        /* 同步至task_1 结束 */
    }
}

/* 启动钩子 */
void start_hook(void)
{
    uStartTask_Ready(task_1); // 启动task_1，初始状态为就绪状态
    uStartTask_Ready(task_2); // 启动task_2，初始状态为就绪状态
    uStartTask_Ready(task_3); // 启动task_3，初始状态为就绪状态
}

#endif
